import type { App } from 'vue'
import { useUserStore } from '../stores/auth'
import { useRouter } from 'vue-router'
import { showWarning } from '../components/layout/GlobalNotification.vue'

// 会话状态检查插件
export default {
  install(app: App) {
    console.log('会话监视插件已加载')
    
    // 页面可见性变化事件处理
    const handleVisibilityChange = async () => {
      // 仅在页面变为可见时处理
      if (document.visibilityState === 'visible') {
        try {
          // 获取当前时间戳
          const now = Date.now()
          
          // 检查最近一次活动时间戳
          const lastActivityStr = localStorage.getItem('lastActivityTime')
          
          if (!lastActivityStr) {
            // 如果没有最近活动时间戳，立即设置
            localStorage.setItem('lastActivityTime', now.toString())
            return
          }
          
          const lastActivity = parseInt(lastActivityStr, 10)
          const inactiveTime = now - lastActivity
          
          // 获取令牌
          const accessToken = localStorage.getItem('accessToken')
          
          // 如果没有令牌，用户未登录，直接返回
          if (!accessToken) return
          
          // 大于30分钟不活跃，视为会话过期
          const SESSION_TIMEOUT = 30 * 60 * 1000 // 30分钟
          
          if (inactiveTime > SESSION_TIMEOUT) {
            console.warn('检测到会话不活跃超过30分钟，验证登录状态')
            
            // 获取用户状态存储
            try {
              // 动态获取router和store，避免在install阶段过早引用
              const router = useRouter()
              const userStore = useUserStore()
              
              // 尝试刷新token验证会话是否有效
              const isValid = await userStore.refreshAccessToken()
              
              if (!isValid) {
                // 会话无效，执行注销并跳转到登录页
                await userStore.logout('会话已过期，请重新登录')
                
                // 当前路径不是登录页时，才跳转
                const currentPath = window.location.pathname
                if (!currentPath.includes('/login') && 
                    !currentPath.includes('/register') && 
                    !currentPath.includes('/forget-password')) {
                  router.push('/login')
                  showWarning('会话已过期，请重新登录')
                }
              } else {
                // 会话有效，更新最后活动时间
                localStorage.setItem('lastActivityTime', now.toString())
              }
            } catch (error) {
              console.error('会话状态检查失败:', error)
            }
          } else {
            // 会话未超时，更新最后活动时间
            localStorage.setItem('lastActivityTime', now.toString())
          }
        } catch (error) {
          console.error('会话监视器错误:', error)
        }
      }
    }
    
    // 注册事件监听
    if (typeof document !== 'undefined') {
      document.addEventListener('visibilitychange', handleVisibilityChange)
      
      // 记录初始活动时间
      localStorage.setItem('lastActivityTime', Date.now().toString())
      
      // 其它用户活动事件
      const events = ['click', 'mousemove', 'keydown', 'scroll']
      const updateActivity = () => {
        localStorage.setItem('lastActivityTime', Date.now().toString())
      }
      
      events.forEach(event => {
        window.addEventListener(event, updateActivity)
      })
      
      // 应用卸载时移除事件监听器
      app.config.globalProperties.$unloadSessionWatcher = () => {
        document.removeEventListener('visibilitychange', handleVisibilityChange)
        events.forEach(event => {
          window.removeEventListener(event, updateActivity)
        })
        console.log('会话监视器已卸载')
      }
    }
  }
} 